home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TURB_VIS / TCYBER25 / COMMON.ZIP / SNIP.PAS < prev    next >
Pascal/Delphi Source File  |  1994-10-20  |  9KB  |  87 lines

  1. {
  2. Turbo Vision CyberTools 2.5
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5. }
  6.  
  7. UNIT SNIP ;{$I APP.INC} INTERFACE USES DOS , OBJECTS , {$IFDEF UseDLL} CYBERAPI ;{$ELSE} VGA ;{$ENDIF}
  8. TYPE SNPFRAMETABLE =ARRAY [ 0 .. 16379 ]  OF LONGINT ;SNPHEADER =RECORD VERSION , FRAMES , HORZRES , VERTRES ,
  9. RESERVED1 , DELAY , RESERVED2 , RESERVED3 :WORD ;END ;PREADSNPFILE =^TREADSNPFILE ;
  10. TREADSNPFILE =OBJECT (TOBJECT)READERROR :INTEGER ;BUFSIZE :WORD ;SNIPFILE :FILE ;READBLOCKPTR :VGADATABUFPTR ;
  11. FRAMETABLEPTR :^SNPFRAMETABLE ;HEADER :SNPHEADER ;CONSTRUCTOR INIT (FILENAME :PATHSTR );DESTRUCTOR DONE ;VIRTUAL;
  12. FUNCTION READFRAME (BLOCKLOC :LONGINT ;BLOCKSIZE :WORD ):WORD ;PROCEDURE READPAL256 (PALPTR :VGAPALETTEPTR );
  13. PROCEDURE READFRAMETABLE ;END ;PDECODESNPFILE =^TDECODESNPFILE ;TDECODESNPFILE =OBJECT (TREADSNPFILE)XSIZE ,
  14. YSIZE :WORD ;PALPTR :VGAPALETTEPTR ;DECODEBLOCKPTR :VGADATABUFPTR ;CONSTRUCTOR INIT (FILENAME :PATHSTR );DESTRUCTOR DONE
  15. ;VIRTUAL;PROCEDURE DECODEDATA (ENCODE ,DECODE:POINTER );PROCEDURE DECODEFRAME (FRAMENUM :WORD );END ;
  16. PDECODESNPSCR =^TDECODESNPSCR ;TDECODESNPSCR =OBJECT (TREADSNPFILE)XSIZE , YSIZE :WORD ;PALPTR :VGAPALETTEPTR ;
  17. DECODEBLOCKPTR :VGADATABUFPTR ;CONSTRUCTOR INIT (FILENAME :PATHSTR );DESTRUCTOR DONE ;VIRTUAL;PROCEDURE DECODEDATA
  18. (ENCODE ,DECODE:POINTER ;SNIPWIDTH ,SCRWIDTH:WORD );PROCEDURE DECODEFRAME (FRAMENUM :WORD );END ;
  19. PWRITESNPFILE =^TWRITESNPFILE ;TWRITESNPFILE =OBJECT (TOBJECT)WRITEERROR :INTEGER ;WRITEBUFPOS :WORD ;SNIPFILE :FILE ;
  20. WRITEBLOCKPTR :VGADATABUFPTR ;FRAMETABLEPTR :^SNPFRAMETABLE ;HEADER :SNPHEADER ;CONSTRUCTOR INIT (FILENAME :PATHSTR ;
  21. TOTFRAMES ,HORZ,VERT,FDELAY:WORD );DESTRUCTOR DONE ;VIRTUAL;PROCEDURE WRITEFRAMEBYTE (FBYTE :BYTE );PROCEDURE FLUSHBUF ;
  22. PROCEDURE WRITEFIRSTFRAME (I :VGADATABUFPTR );PROCEDURE WRITEPAL256 (PALPTR :VGAPALETTEPTR );PROCEDURE WRITEFRAMETABLE ;
  23. END ;CONST SNPMAXXSIZE =320 ;SNPMAXYSIZE =200 ;SNPMAXDECODESIZE =VGADATABUFMAX + 1 ;SNPMAXENCODESIZE =16384 ;
  24. SNPNOERROR =0 ;SNPMEMALLOC =- 100 ;SNPBADVERSION =- 101 ;SNPNOT256COLOR =- 103 ;SNPXSIZE =- 104 ;SNPYSIZE =- 105 ;
  25. SNPBUFOVERFLOW =- 106 ;SNPIORESULTSTART =100 ;SNPIORESULTEND =162 ;SNPVERSION =$0001 ;
  26. IMPLEMENTATION USES MEMORY ;CONSTRUCTOR TREADSNPFILE.INIT (FILENAME:PATHSTR);BEGIN INHERITED INIT;ASSIGN (SNIPFILE ,
  27. FILENAME );{$I-}RESET (SNIPFILE , 1 );{$I+}READERROR := IORESULT ;IF READERROR =SNPNOERROR THEN BEGIN {$I-}BLOCKREAD
  28. (SNIPFILE , HEADER , SIZEOF (HEADER ));{$I+}READERROR := IORESULT ;IF READERROR =SNPNOERROR THEN BEGIN IF HEADER.VERSION
  29. =SNPVERSION THEN BEGIN BUFSIZE := HEADER.HORZRES * HEADER.VERTRES + 1 ;IF BUFSIZE <= SNPMAXDECODESIZE THEN
  30. BEGIN READBLOCKPTR := MEMALLOC (BUFSIZE );IF READBLOCKPTR =NIL THEN READERROR := SNPMEMALLOC ;FRAMETABLEPTR := MEMALLOC
  31. ((HEADER.FRAMES + 1 )* SIZEOF (LONGINT ));IF FRAMETABLEPTR =NIL THEN READERROR := SNPMEMALLOC END ELSE READERROR :=
  32. SNPBUFOVERFLOW END ELSE READERROR := SNPBADVERSION END END END ;DESTRUCTOR TREADSNPFILE.DONE ;BEGIN IF READBLOCKPTR <>
  33. NIL THEN FREEMEM (READBLOCKPTR , BUFSIZE );IF FRAMETABLEPTR <> NIL THEN FREEMEM (FRAMETABLEPTR , (HEADER.FRAMES + 1 )*
  34. SIZEOF (LONGINT ));{$I-}CLOSE (SNIPFILE );{$I+}READERROR := IORESULT ;INHERITED DONE END ;FUNCTION TREADSNPFILE.READFRAME
  35. (BLOCKLOC:LONGINT;BLOCKSIZE:WORD):WORD ;VAR O1lIII0lO0I1:WORD;BEGIN {$I-}SEEK (SNIPFILE , BLOCKLOC );{$I+}READERROR :=
  36. IORESULT ;IF READERROR =SNPNOERROR THEN BEGIN {$I-}BLOCKREAD (SNIPFILE , READBLOCKPTR ^, BLOCKSIZE , O1lIII0lO0I1 );
  37. {$I+}READERROR := IORESULT ;READFRAME := O1lIII0lO0I1 END ELSE READFRAME := 0 END ;PROCEDURE TREADSNPFILE.READPAL256
  38. (PALPTR:VGAPALETTEPTR);BEGIN {$I-}SEEK (SNIPFILE , SIZEOF (HEADER ));{$I+}READERROR := IORESULT ;IF READERROR =SNPNOERROR
  39. THEN BEGIN {$I-}BLOCKREAD (SNIPFILE , PALPTR ^, SIZEOF (PALPTR ^));{$I+}READERROR := IORESULT END END ;
  40. PROCEDURE TREADSNPFILE.READFRAMETABLE ;BEGIN {$I-}SEEK (SNIPFILE , SIZEOF (HEADER )+ SIZEOF (VGAPALETTE ));
  41. {$I+}READERROR := IORESULT ;IF READERROR =SNPNOERROR THEN BEGIN {$I-}BLOCKREAD (SNIPFILE , FRAMETABLEPTR ^,
  42. (HEADER.FRAMES + 1 )* SIZEOF (LONGINT ));{$I+}READERROR := IORESULT END END ;CONSTRUCTOR TDECODESNPFILE.INIT
  43. (FILENAME:PATHSTR);BEGIN INHERITED INIT(FILENAME );IF READERROR =SNPNOERROR THEN BEGIN IF HEADER.HORZRES <= SNPMAXXSIZE
  44. THEN BEGIN IF HEADER.VERTRES <= SNPMAXYSIZE THEN BEGIN DECODEBLOCKPTR := MEMALLOC (HEADER.HORZRES * HEADER.VERTRES );IF
  45. DECODEBLOCKPTR <> NIL THEN BEGIN XSIZE := HEADER.HORZRES ;YSIZE := HEADER.VERTRES ;PALPTR := MEMALLOC (SIZEOF (PALPTR
  46. ^))END ELSE READERROR := SNPMEMALLOC END ELSE READERROR := SNPYSIZE END ELSE READERROR := SNPXSIZE END END ;
  47. DESTRUCTOR TDECODESNPFILE.DONE ;BEGIN IF DECODEBLOCKPTR <> NIL THEN FREEMEM (DECODEBLOCKPTR , XSIZE * YSIZE );IF PALPTR
  48. <> NIL THEN FREEMEM (PALPTR , SIZEOF (PALPTR ^));INHERITED DONE END ;PROCEDURE TDECODESNPFILE.DECODEDATA
  49. (ENCODE,DECODE:POINTER);ASSEMBLER;ASM {} PUSH DS {} LES SI , ENCODE{} LDS DI , DECODE{} MOV AX , 0 {} @while1 : {}
  50. MOV AL , ES : [ SI ] {} CMP AL , 64 {} JB @while2 {} MOV DS : [ DI ] , AL {} INC SI {} INC DI {} JMP @while1 {}
  51. @while2 : {} CMP AL , 0 {} JE @enddo2 {} INC SI {} ADD DI , AX {} JMP @while1 {} @enddo2 : {} POP DS {} END;
  52. PROCEDURE TDECODESNPFILE.DECODEFRAME (FRAMENUM:WORD);BEGIN IF READERROR =SNPNOERROR THEN BEGIN READFRAME (FRAMETABLEPTR
  53. ^[ FRAMENUM ] , FRAMETABLEPTR ^[ FRAMENUM + 1 ] - FRAMETABLEPTR ^[ FRAMENUM ] );IF READERROR =SNPNOERROR THEN DECODEDATA
  54. (READBLOCKPTR , DECODEBLOCKPTR )END END ;CONSTRUCTOR TDECODESNPSCR.INIT (FILENAME:PATHSTR);BEGIN INHERITED INIT(FILENAME
  55. );IF READERROR =SNPNOERROR THEN BEGIN IF HEADER.HORZRES <= SNPMAXXSIZE THEN BEGIN IF HEADER.VERTRES <= SNPMAXYSIZE THEN
  56. BEGIN DECODEBLOCKPTR := PTR (SEGA000 , $0000 );XSIZE := HEADER.HORZRES ;YSIZE := HEADER.VERTRES ;PALPTR := MEMALLOC
  57. (SIZEOF (PALPTR ^))END ELSE READERROR := SNPYSIZE END ELSE READERROR := SNPXSIZE END END ;DESTRUCTOR TDECODESNPSCR.DONE ;
  58. BEGIN IF PALPTR <> NIL THEN FREEMEM (PALPTR , SIZEOF (PALPTR ^));INHERITED DONE END ;PROCEDURE TDECODESNPSCR.DECODEDATA
  59. (ENCODE,DECODE:POINTER;SNIPWIDTH,SCRWIDTH:WORD);ASSEMBLER;ASM {} PUSH DS {} LES SI , ENCODE{} LDS DI , DECODE{}
  60. MOV AX , 0 {} MOV BX , SNIPWIDTH{} MOV CX , SCRWIDTH{} SUB CX , BX {} @while1 : {} MOV AL , ES : [ SI ] {} CMP AL , 64 {}
  61. JB @while2 {} MOV DS : [ DI ] , AL {} INC SI {} INC DI {} DEC BX {} JNZ @while1 {} MOV BX , SNIPWIDTH{} ADD DI , CX {}
  62. JMP @while1 {} @while2 : {} CMP AL , 0 {} JE @enddo2 {} INC SI {} CMP AX , BX {} JB @then1 {} ADD DI , AX {}
  63. ADD DI , CX {} ADD BX , SNIPWIDTH{} SUB BX , AX {} JMP @while1 {} @then1 : {} ADD DI , AX {} SUB BX , AX {}
  64. JMP @while1 {} @enddo2 : {} POP DS {} END;PROCEDURE TDECODESNPSCR.DECODEFRAME (FRAMENUM:WORD);BEGIN IF READERROR
  65. =SNPNOERROR THEN BEGIN READFRAME (FRAMETABLEPTR ^[ FRAMENUM ] , FRAMETABLEPTR ^[ FRAMENUM + 1 ] - FRAMETABLEPTR ^[
  66. FRAMENUM ] );IF READERROR =SNPNOERROR THEN DECODEDATA (READBLOCKPTR , DECODEBLOCKPTR , XSIZE , VGASCR256LINE )END END ;
  67. CONSTRUCTOR TWRITESNPFILE.INIT (FILENAME:PATHSTR;TOTFRAMES,HORZ,VERT,FDELAY:WORD);BEGIN INHERITED INIT;ASSIGN (SNIPFILE ,
  68. FILENAME );{$I-}REWRITE (SNIPFILE , 1 );{$I+}WRITEERROR := IORESULT ;IF WRITEERROR =SNPNOERROR THEN
  69. BEGIN WITH HEADER DO BEGIN VERSION := SNPVERSION ;FRAMES := TOTFRAMES ;HORZRES := HORZ ;VERTRES := VERT ;RESERVED1 :=
  70. HORZRES * VERTRES ;DELAY := FDELAY ;RESERVED2 := 64 ;RESERVED3 := 255 END ;{$I-}BLOCKWRITE (SNIPFILE , HEADER , SIZEOF
  71. (HEADER ));{$I+}WRITEERROR := IORESULT ;WRITEBLOCKPTR := MEMALLOC (SNPMAXENCODESIZE );IF WRITEBLOCKPTR =NIL THEN
  72. WRITEERROR := SNPMEMALLOC ;FRAMETABLEPTR := MEMALLOC ((HEADER.FRAMES + 1 )* SIZEOF (LONGINT ));IF FRAMETABLEPTR <> NIL
  73. THEN FILLCHAR (FRAMETABLEPTR ^, (HEADER.FRAMES + 1 )* SIZEOF (LONGINT ), 0 )ELSE WRITEERROR := SNPMEMALLOC END END ;
  74. DESTRUCTOR TWRITESNPFILE.DONE ;BEGIN IF WRITEBLOCKPTR <> NIL THEN FREEMEM (WRITEBLOCKPTR , SNPMAXENCODESIZE );IF
  75. FRAMETABLEPTR <> NIL THEN FREEMEM (FRAMETABLEPTR , (HEADER.FRAMES + 1 )* SIZEOF (LONGINT ));{$I-}CLOSE (SNIPFILE );
  76. {$I+}WRITEERROR := IORESULT ;INHERITED DONE END ;PROCEDURE TWRITESNPFILE.WRITEFRAMEBYTE (FBYTE:BYTE);BEGIN IF WRITEBUFPOS
  77. =SNPMAXENCODESIZE THEN BEGIN {$I-}BLOCKWRITE (SNIPFILE , WRITEBLOCKPTR ^, SNPMAXENCODESIZE );{$I+}WRITEERROR := IORESULT
  78. ;WRITEBUFPOS := 0 END ;WRITEBLOCKPTR ^[ WRITEBUFPOS ] := FBYTE ;INC (WRITEBUFPOS )END ;PROCEDURE TWRITESNPFILE.FLUSHBUF ;
  79. BEGIN IF WRITEBUFPOS > 0 THEN BEGIN {$I-}BLOCKWRITE (SNIPFILE , WRITEBLOCKPTR ^, WRITEBUFPOS );{$I+}WRITEERROR :=
  80. IORESULT ;WRITEBUFPOS := 0 END END ;PROCEDURE TWRITESNPFILE.WRITEFIRSTFRAME (I:VGADATABUFPTR);BEGIN {$I-}BLOCKWRITE
  81. (SNIPFILE , I ^, HEADER.HORZRES * HEADER.VERTRES );{$I+}WRITEERROR := IORESULT ;END ;PROCEDURE TWRITESNPFILE.WRITEPAL256
  82. (PALPTR:VGAPALETTEPTR);BEGIN {$I-}SEEK (SNIPFILE , SIZEOF (HEADER ));{$I+}WRITEERROR := IORESULT ;IF WRITEERROR
  83. =SNPNOERROR THEN BEGIN {$I-}BLOCKWRITE (SNIPFILE , PALPTR ^, SIZEOF (PALPTR ^));{$I+}WRITEERROR := IORESULT END END ;
  84. PROCEDURE TWRITESNPFILE.WRITEFRAMETABLE ;BEGIN {$I-}SEEK (SNIPFILE , SIZEOF (HEADER )+ SIZEOF (VGAPALETTE ));
  85. {$I+}WRITEERROR := IORESULT ;IF WRITEERROR =SNPNOERROR THEN BEGIN {$I-}BLOCKWRITE (SNIPFILE , FRAMETABLEPTR ^,
  86. (HEADER.FRAMES + 1 )* SIZEOF (LONGINT ));{$I+}WRITEERROR := IORESULT END END ;END .
  87.